﻿using System;
using System.Data;
using System.Collections.Generic;


namespace Lib.Utilities
{
    /// <summary>
    /// Thao tác với table dữ liệu
    /// </summary>
    public class LibTable
    {
        public static int FindRowByColumn(DataTable table, string name, object value)
        {
            if (!isNullOrEmtyTable(table))
            {
                string str = LibConvert.ObjectToString(value);
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    if (!(table.Rows[i][name] is DBNull) && (LibConvert.ObjectToString(table.Rows[i][name]) == str))
                    {
                        return i;
                    }
                }
            }
            return -1;
        }
        public static bool isNullOrEmtyTable(DataTable table)
        {
            if ((table == null) && (table.Rows.Count == 0))
            {
                return true;
            }
            return false;
        }
        public static string TableToJson(DataTable dt)
        {
            System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
            Dictionary<string, object> row = null;

            foreach (DataRow dr in dt.Rows)
            {
                row = new Dictionary<string, object>();
                foreach (DataColumn col in dt.Columns)
                {
                    row.Add(col.ColumnName.Trim().ToUpper(), dr[col]);
                }
                rows.Add(row);
            }
            return serializer.Serialize(rows);
        }

        /// <summary>
        /// Chuyển định dạng bảng sang định dạng chuỗi Json
        /// </summary>
        /// <param name="dt">Bảng cần chuyển</param>
        /// <param name="a_cot">Cột cần chuỷen</param>
        /// <returns></returns>
        public static string TableToJson(DataTable dt, string[] a_cot)
        {
            if ((a_cot == null) || (a_cot.Length == 0))
            {
                return TableToJson(dt);
            }

            System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
            Dictionary<string, object> row = null;

            DataColumnCollection columns = dt.Columns;

            foreach (DataRow dr in dt.Rows)
            {
                row = new Dictionary<string, object>();
                for (int i = 0; i < a_cot.Length; i++)
                {
                    if (columns.Contains(a_cot[i]))
                    {
                        row.Add(a_cot[i].Trim().ToUpper(), dr[a_cot[i]]);
                    }
                }
                rows.Add(row);
            }
            return serializer.Serialize(rows);
        }


        public static string TableToJson(DataTable dt, int indexRow)
        {
            if (isNullOrEmtyTable(dt)) return "";
            if (indexRow >= dt.Rows.Count) throw new Exception("Dòng vượt quá tổng số dòng");
            System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
            Dictionary<string, object> row = new Dictionary<string,object>();
            DataRow dr = dt.Rows[indexRow];
            for(int i=0; i< dt.Columns.Count; i++)
            {
                row.Add(dt.Columns[i].ColumnName.Trim().ToUpper(), dr[dt.Columns[i].ColumnName]);
            }
            rows.Add(row);
            return serializer.Serialize(rows);
        }

        /// <summary>
        /// Tìm dòng có cột bằng với giá trị truyền
        /// </summary>
        /// <param name="table">Bảng cần tìm</param>
        /// <param name="name">Tên cột</param>
        /// <param name="val">Giá trị truyền</param>
        public static int FindIndexRow(DataTable table, string name, object val)
        {
            if (!isNullOrEmtyTable(table))
            {
                string str = LibConvert.ObjectToString(val);
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    if (!(table.Rows[i][name] is DBNull) && (LibConvert.ObjectToString(table.Rows[i][name]) == str))
                    {
                        return i;
                    }
                }
            }
            return -1;
        }

        /// <summary>
        /// Thêm một cột mới vào cuối, mặc định tên cột tự động viết hoa
        /// </summary>
        /// <param name="b_dt">Tên bảng cần thêm cột</param>
        /// <param name="nameCol">Tên cột muốn thêm</param>
        public static void AddNewColumns(ref DataTable b_dt, string nameCol)
        {
            if (!isNullOrEmtyTable(b_dt))
            {
                b_dt.Columns.Add(nameCol);
            }
        }

        /// <summary>
        /// Thêm danh sách cột dạng mảng, mặc định viết hoa và chèn theo thứ tự vào cuối
        /// </summary>
        /// <param name="table">Table cần thêm</param>
        /// <param name="nameCol">Mảng cột cần thêm</param>
        public static void AddNewColumns(ref DataTable table, string[] nameCol)
        {
            if (!isNullOrEmtyTable(table))
            {
                for (int i = 0; i < nameCol.Length; i++)
                    AddNewColumns(ref table, nameCol[i]);
                table.AcceptChanges();
            }
        }

        /// <summary>
        /// Thêm 1 cột vào Table từ 1 giá trị String
        /// </summary>
        /// <param name="b_dt">Bảng cần thêm</param>
        /// <param name="b_truong">Tên trường cần thêm</param>
        /// <param name="b_gtri">Giá trị trường cần thêm</param>
        public static void AddNewColumns(ref DataTable b_dt, string nameCol, string val)
        { // Dan
            b_dt.Columns.Add(nameCol, val.GetType());
            for (int i = 0; i < b_dt.Rows.Count; i++) b_dt.Rows[i][nameCol] = val;
            b_dt.AcceptChanges();
        }

        /// <summary>
        /// Tạo bảng với dữ liệu cho sẵn ( tên và giá trị)
        /// </summary>
        /// <param name="nameCol">Mảng cot</param>
        /// <param name="val">Mảng giá trị</param>
        /// <returns></returns>
        public static DataTable CreateTable(string[] nameCol, object[] val)
        {
            DataTable table = new DataTable();
            for (int i = 0; i < nameCol.Length; i++)
            {
                table.Columns.Add(nameCol[i]);
            }
            AddNewRows(ref table, val);
            return table;
        }
        public static void AddNewRows(ref DataTable b_dt, object[] val)
        {
            DataRow row = b_dt.NewRow();
            for (int i = 0; i < val.Length; i++)
            {
                row[i] = val[i];
            }
            b_dt.Rows.Add(row);
            b_dt.AcceptChanges();
        }


    }
}
